## Событийно-ориентированное программирование

* Каталог `/EventEmitter`
  - `simpleEventEmitter.js` - простейшая реализация EventEmitter
  - `enhancedEventEmitter.js` - расширенная версию EventEmitter для Node.js
* Каталог 'LiveTable' - пример таблицы, которая синхронизируется
между несколькими браузерами через отправку событий по Websocket.

Перед запуском `LiveTable` нужно запустить `npm install` из этого каталога,
npm устаносит зависимости, указанные в `package.json`, после этого можно
запускать `sudo node server`. Внимание, если другая программа заняла 80 порт,
то нужно ее остановить, это может быть Apache, Skype, nginx, IIS и др. Если
не удается освободить 80 порт, то заменить его на любой другой порт, поправив
номер порта в коде сервера и допишите его в URL вебсокета в коде клиента.

## Задания

1. Реализовать расширенный EventEmitter, как в 'enhancedEventEmitter.js' на базе
простого из `simpleEventEmitter.js`, а не на базе встроенной в Node.js библиотеки
`events`. Адаптировать расширенный EventEmitter для одинаковой работы в Node.js
и в браузере.
2. Модифицировать 'LiveTable' так, чтоб в ячейках можно было использовать
формулы, как в электронных таблицах, например: `= A1 + B2`, но сделать это без
использования циклов, а на событийной модели, т.е. при помощи подписки на
изменения, с применением EventEmitter.
3. Транслировать события не только внутри приложения, но и по сети через
Websocket и отправлять их в EventEmitter.

## Дополнительные задания

4. Сделать сетевую реализацию EventEmitter, делающую взаимодействие по сети
прозрачным между клиентом и сервером.

5. Модифицировать сетевую реализацию EventEmitter, чтоб взаимодействие по сети
было прозрачным между несколькими клиентами, через сервером. Реализовать
ретрансляцию событий.
